package com.me.myFramework.myAop.aop200.intercept.method;

import com.me.myFramework.myAop.aop200.ProxyFactory;
import com.me.myFramework.myAop.aop200.intercept.Interceptor;

import java.lang.reflect.Method;
import java.util.List;

/**
 * 自己实现 AOP-200：  <p></p>
 *
 * 描述以方法为切入点的切面拦截器，本质上是一个组合了 advice 的 模板方法
 *
 * @author ME
 * @date 2021/9/26
 */
public interface MethodInterceptor extends Interceptor {

    /**
     * 定义切面执行顺序的模板方法，如：方法执行前的切点
     */
    Object invoke(Method method, Object[] args, Object target) throws Throwable;

    /**
     * 由于 {@link ProxyFactory#getInterceptors(Method, Class) advice 转 MethodInterceptor} 时已经匹配过 切点表达式了，此处直接执行 advice 即可。    <p></p>
     *
     * TODO
     *  1，一个代理类中通过责任链实现多切面。增强逻辑的拦截器链 MethodInterceptor（或者 切面链）必须一直传递下去，当前执行的哪一个切面也需要传递下去，    <p>
     *  否则无法确定 该执行目标方法？还是继续执行 advice？以及下一次该执行哪个 advice。    <p>
     *  2，方法声明的参数太多了，需要封装成 ReflectiveMethodInvocation 对象
     */
    Object invoke111(Method method, Object[] args, Object target, List<MethodInterceptor> interceptors, int index) throws Throwable;

}
